package h0715;

import java.util.Arrays;
import java.util.Scanner;
import java.util.function.BinaryOperator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
  * @description 火星文计算2
  * @author 不知名帅哥
  * @date 2024/7/15 20:07
  * @version 1.0
*/
public class LeetSpeakCompute3 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String s = sc.next();
        System.out.println(getResult(s));
    }

    private static long getResult(String s) {
        Pattern p = Pattern.compile("(\\d+)\\#(\\d+)");
        while (true){
            Matcher matcher = p.matcher(s);
            if (!matcher.find()){
                break;
            }
            String subStr= matcher.group();
            long x=Long.parseLong(matcher.group(1));
            long y=Long.parseLong(matcher.group(2));
            //subStr.replace("$","\\$")这个的结果相当于regex
            s=s.replaceFirst(subStr.replace("#","\\#"), String.valueOf(4*x+3*y+2));
        }
        return Arrays.stream(s.split("\\$")).map(Long::parseLong)
                .reduce((aLong, aLong2) -> aLong*2+aLong2+3).orElse(0L);
        //reduce 方法
        //reduce 方法用于将流中的元素按照指定的规则进行合并。它接收一个二元运算符，按照该运算符的规则从流中逐个取出元素进行合并。
        //在你的代码中，二元运算符是 (aLong, aLong2) -> aLong * 2 + aLong2 + 3，具体含义是：
        //取两个 Long 类型的元素 aLong 和 aLong2。
        //计算 aLong * 2 + aLong2 + 3。
        //这意味着流中的元素会按照这个规则进行累积计算。
        //orElse方法
        //orElse 方法是 Optional 类中的一个方法，用于在没有值时提供一个默认值。由于 reduce 方法返回的是一个 Optional<Long>，因此你需要使用 orElse 来处理可能的空值情况。
        //在你的代码中，orElse(0L) 的意思是：
        //如果 reduce 方法有结果（即流中有元素），那么返回这个结果。
        //如果 reduce 方法没有结果（即流中没有元素），那么返回默认值 0L。
    }
}
